/**
 * Copyright (c) 2012, Hakans Pirates - 
 * Johan Andersson spaiki17@gmail.com, 
 * Mattias Lundberg lundberg.mattias@gmail.com, 
 * Samuel Sjodin sjoodin@gmail.com
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the <organization> nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *  
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package pirates.ship.cannon;

import com.jme3.app.SimpleApplication;
import com.jme3.asset.AssetManager;
import com.jme3.audio.AudioNode;
import com.jme3.bullet.PhysicsSpace;
import com.jme3.bullet.collision.shapes.SphereCollisionShape;
import com.jme3.bullet.control.RigidBodyControl;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Mesh;
import com.jme3.scene.Node;
import com.jme3.scene.shape.Sphere;
import pirates.Settings;

/**
 * 
 * @author mattias
 */
public class CannonBall {

	private static Mesh sphere = null;
	private Node rootNode;
	private PhysicsSpace physics;
	private static Material black;
	private AssetManager assetManager;
	private static int lastid = 0;
	public int id;
	private AudioNode sound;
	private SimpleApplication app;
        private RigidBodyControl parent;

	public CannonBall(SimpleApplication app, RigidBodyControl parent, PhysicsSpace physics, Node rootNode) {
		assetManager = app.getAssetManager();
                this.parent = parent;

		if (black == null) {
			black = new Material(assetManager,
					"Common/MatDefs/Misc/Unshaded.j3md");
			black.setColor("Color", new ColorRGBA(0, 0, 0, 0));
		}
		if (sphere == null) {
			sphere = new Sphere(10, 10, 2.5f);
		}

		// Doesn't work with static :(
		sound = new AudioNode(assetManager, "Sounds/Effects/Cannon.wav");
		sound.setLooping(false);
		sound.setReverbEnabled(true);

		id = lastid++;

		this.physics = physics;
		this.rootNode = rootNode;
		this.app = app;
	}

	public void shoot(Vector3f position, Vector3f direction) {
		if (!Settings.IS_SERVER) {
			app.getAudioRenderer().playSource(sound);
		}
		Vector3f dir = direction.normalize();

		Geometry bulletg = new Geometry(getName(), sphere);
		bulletg.setMaterial(black);
		bulletg.setLocalTranslation(position);

		SphereCollisionShape bulletCollisionShape = new SphereCollisionShape(
				2.5f);
		RigidBodyControl bulletNode = new BallControl(app, parent,
				bulletCollisionShape, Settings.BALL_MASS);
		bulletNode.setGravity(Settings.GRAVITY3F);
		bulletNode.setLinearVelocity(dir.mult(Settings.SHOOT_SPEED));
		bulletg.addControl(bulletNode);
		rootNode.attachChild(bulletg);
		physics.add(bulletNode);
		physics.setGravity(Settings.GRAVITY3F);
	}

	public String getName() {
		return "cannon_ball" + id;
	}
}
